package epsofts.Neutron;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @version 1.0
 * @created 14-sept.-2006 22:48:07
 */
public class JoueurHumain implements IJoueur
{
	public static final String LABEL = "Humain (mode console)";
	public static final Boolean ENABLED = false;
	
	static final boolean bVerifCoups = false;
	static final String ABCDE = "ABCDE";
	BufferedReader	FromKeyboard	= new BufferedReader(new InputStreamReader(System.in));

	public JoueurHumain()
	{

	}

	private void AfficherPlateau(final Plateau plateau)
	{
		eCase cases[] = plateau.getCases();
		
		for(short x = -1; x < 5; ++x)
		{
			for(short y = -1; y < 5; ++y)
			{
				if (x < 0)
				{
					System.out.print(String.valueOf(y+1));
				}
				else if (y < 0)
				{
					System.out.print(ABCDE.charAt(x));
				}
				else
				{
					switch(cases[x * 5 + y])
					{
						case VIDE:
						{
							System.out.print(".");
							break;
						}
						case BLEUE:
						{
							System.out.print("O");
							break;
						}
						case ROUGE:
						{
							System.out.print("X");
							break;
						}
						case NEUTRON:
						{							
							System.out.print("N");
							break;
						}
					}
				}
			}
			System.out.println("");
		}
	}

	/**
	 * G�re l'interface et au final retourne un coup, celui demand� par le joueur.
	 * @param plateau
	 */
	public Coup Jouer(final Plateau plateau) throws InterruptedException
	{
		int iNeutronDestination, iNeutronOrigine = plateau.getNeutron(), iBilleOrigine, iBilleDestination;

		AfficherPlateau(plateau);
		eCase[] cases = plateau.getCases();

		// Tant que la position choisie n'est pas vide (elle est peut �tre incorrecte).
		do
		{
			System.out.print("Neutron Destination : ");
			iNeutronDestination = SaisiePosition();
		}while(bVerifCoups && (cases[iNeutronDestination] != eCase.VIDE));
		
		// Tant qu'une bille de bonne couleur n'est pas choisie
		do
		{
			System.out.print("Bille Origine : ");
			iBilleOrigine = SaisiePosition();
		}while(bVerifCoups && (cases[iBilleOrigine] != plateau.getTour()));
		
		// Tant qu'une case vide n'est pas choisie
		do
		{
			System.out.print("Bille Destination : ");
			iBilleDestination = SaisiePosition();
		}while(bVerifCoups && (cases[iBilleDestination] != eCase.VIDE) && (iBilleDestination != iNeutronOrigine));

		return new Coup((short) iBilleOrigine, (short) iBilleDestination, (short) iNeutronOrigine, (short) iNeutronDestination);
	}

	/**
	 * Doit tnterrompre le tour du joueur si celui-ci �tait en train de jouer.
	 */
	public void Stopper()
	{
		System.out.println("Stopper");
	}
	
	/* (non-Javadoc)
	 * @see Neutron.IJoueur#OnJeuFini(Neutron.eCase)
	 */
	public void OnJeuFini(eCase i_vainqueur)
	{
		System.out.println("Jeu termin�");
		System.out.print("Vainqueur: ");
		switch(i_vainqueur)
		{
			case ROUGE:
			{
				System.out.println("ROUGE");
				break;
			}
			case BLEUE:
			{
				System.out.println("BLEU");
				break;
			}
			default:
			{
				System.out.println("Nul");
				break;
			}
		}
	}
	
	/**
	 * Boucle sur la saisie d'une position du plateau.
	 * @return int position saisie.
	 */
	private int SaisiePosition()
	{
		String chaine = null;
		int x = -1, y = -1;
		do
		{
			try
			{
				chaine = FromKeyboard.readLine();
				x = Integer.parseInt(chaine.substring(0, 1));
				y = ABCDE.indexOf(chaine.toUpperCase().substring(1,2)) + 1;
			}
			catch(IOException e)
			{
				x = -1;
				y = -1;
				System.out.print("Erreur de saisie, recommencez : ");
			}
		}while((x < 0) || (y < 0));
		
		return ((y-1) * 5) + (x - 1);
	}

}
